import random


# 运算符示例
def count1():
    a = 10 / 3
    print(f'除不尽f得到float  结果类型{type(a)} 10/3结果值 ={a}')

    b = "{:.2f}".format(a)
    print(f'保留2位小数 = {b}')
    print(f'四舍五入保留2位小数 {round(a, 2)}')

    b = "{:.2%}".format(a)
    print(f'转换为百分比 =  {b}')

    a = 10 // 3
    print(f'取整除得到int  结果类型{type(a)} 10/3结果值 ={a}')
    a = -10 // 3
    print(f'取整除 - 向下取接近商的整数  结果类型{type(a)} -10/3结果值 ={a}')
    a = 2 ** 3
    print(f'返回x的y次幂  2的3次幂 ={a}')


# 求一组范围数值的和
def sum1(minX, maxY):
    sumResult = 0
    # 方法1
    # sumResult= sum(range(minX,maxY))

    # 方法2
    for i in range(minX, maxY):
        sumResult += i
    else:
        print("计算完毕")

    print(f'{minX}累加到{maxY}={sumResult}')


# 推导式范例，均可以添加if条件，可选项
def getCollection():
    list1 = [1, 32, 34, 41, 5, 66, 11, 23, 100]
    list1 = [i for i in list1 if i % 2 == 0]
    print(f'list 推导式 if条件可选 过滤出能被2整除的数据={list1}')

    arr = tuple(list1) + (2, 3, 5, 212, 111)
    arr = (i for i in arr if i > 5)
    arr = tuple(arr)  # 推导式得到的结果是返回的是生成器对象，需要再重新转换
    print(f'元组 推导式 if条件可选 过滤>5数据={arr}')

    set1 = {-19, 11, -2, 3, 4, 4, 5, -6, 5, 11, 20}
    set1 = {i for i in set1 if i < 0}
    print(f'集合 推导式 if条件可选 过滤<0数据={set1}')

    map1 = {i: i + 1 for i in list1}
    print(f'字典 推导式 if条件可选 过滤<0数据={map1}')


# 四舍五入round示例
def testRound():
    """
    当小数点左边为偶数：小数点右边X < 6，舍
    当小数点左边为偶数：小数点右边X >= 6，入
    当小数点左边为奇数：小数点右边X < 5，舍
    当小数点左边为奇数：小数点右边X >= 5，入
    当个位为奇数，小数部分>=0.5入，其余为舍
    当个位为偶数，小数部分>0.5入，其余为舍。
    """
    print(round(10.4))  # 10
    print(round(10.5))  # 10
    print(round(10.50))  # 10
    print(round(10.6))  # 11

    print(round(11.4))  # 11
    print(round(11.5))  # 12
    print(round(11.6))  # 12

    a, b = 60, 13
    print(f'a&b={a & b}')


def test1():
    # 每个变量在使用前都必须赋值,它没有类型，我们所说的"类型"是变量所指的内存中对象的类型
    a = 1;
    print(
        f'类型转换 : 转换为int(a) ={int(a)} 转换为float(a)={float(a)} 转换为复数complex(a) = {complex(a)}  转换为复数complex(a+2i)= {complex(a, a + 1)}')
    print(f'获取指定范围的随机数 : {random.randrange(1, 100, 1)}')
    print(f'从序列中获取随机数 : {random.choice([1, 3, 5, 7, 100, 1000, 1, 20])}')
    b = 1.1
    c = b + a
    print(f'整形与小数相加后得到类型 : {type(c)}')
    print(f'强制将小数转换为int : {int(c)}')
    print(f'强制将字符串转换为int : {int("234")}')
    print(f'强制将整形转换为字符串str : {str(23)}')


def numberDemo():
    ## 分开赋值
    a, b, c, d = 1, 2, 3, 4
    # 内置的 type() 函数可以用来查询变量所指的对象类型
    # isinstance()会认为子类是一种父类类型,用于验证类型是否匹配
    print(f'a ={a} b={b} c = {c} d = {d} \n a的类型={type(a)}  \n 验证a的数据类型={isinstance(a, int)},返回True则是int')

    ## 连续赋值
    f1 = f2 = f3 = f = 4
    # f 格式化打印 ,\n换行
    print(f'f1 = {f1},f2 = {f2},f3 = {f3},f = {f}')

    # Python3 中，bool 是 int 的子类，True 和 False 可以和数字相加， True==1、False==0 会返回 True，但可以通过 is 来判断类型。
    a = True
    b = a + 1
    print(f'a ={a} b={b}')

    # 通过 is 来判断类型，is 比较的是两个对象的 id 是否相等，也就是是否是同一个对象，是否指向同一个内存地址。
    if 1 == True:
        print("yes")
    else:
        print("no")

    # del语句删除一些对象引用，
    # del a
    # print(f'a ={a} b={b}')  ##a已经删除，此时再引用将会报错


if __name__ == '__main__':
    # test1()
    # numberDemo()
    # testRound()
    # getCollection()
    # sum1(1,4)
    count1()
